home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / OCT_DLL.PAK / DLLRUN.CPP next >
C/C++ Source or Header  |  1997-05-06  |  4KB  |  105 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectComponents
  3. // Copyright (c) 1994, 1996 by Borland International, All Rights Reserved
  4. //
  5. // Simple EXE to load and run a DLL server
  6. //----------------------------------------------------------------------------
  7. #define STRICT
  8. #include <windows.h>
  9. #include <shellapi.h>
  10. #include <ole2.h>
  11. #include <winsys\registry.h>
  12.  
  13. #define _IFUNC  STDMETHODCALLTYPE
  14. typedef HRESULT STDAPICALLTYPE (*TDllGetClassObject)(const GUID far& clsid,
  15.                                                      const GUID far& iid,
  16.                                                      void far* far* retObj);
  17. class TDummy : public IUnknown {
  18.   HRESULT _IFUNC QueryInterface(const GUID far& iid, void far* far* pif)
  19.    {*pif = 0; return iid==IID_NULL ? NOERROR : ResultFromScode(E_NOINTERFACE);}
  20.   unsigned long _IFUNC AddRef() {return 1;}
  21.   unsigned long _IFUNC Release(){return 0;}
  22. };
  23.  
  24. int PASCAL
  25. WinMain(HINSTANCE/*hInst*/, HINSTANCE/*prev*/, char far* cmdLine, int/*show*/)
  26. {
  27.   char* error = 0;
  28.   const int guidChars = 38;
  29.   const int guidKeySize = sizeof("CLSID\\")-1;
  30.   char guidBuf[guidKeySize + guidChars + 1] = "CLSID\\";
  31.   const int pathSize = 260;
  32.   char path[pathSize];
  33.   long guidBufSize = guidChars + 1;
  34.   long pathBufSize = pathSize;
  35.   HKEY key;
  36.  
  37.   if (!cmdLine || !cmdLine[0]) {
  38.     cmdLine = "Error";
  39.     error = "Command line must have DLL ProgId";
  40.   }
  41.   else if (::RegOpenKey(TRegKey::ClassesRoot, cmdLine, &key) != S_OK) {
  42.     error = "ProgId not found in Registry";
  43.   }
  44.   else {
  45.     long rstat = ::RegQueryValue(key, "CLSID", guidBuf+guidKeySize, &guidBufSize);
  46.      ::RegCloseKey(key);
  47.     if (rstat != S_OK ||
  48.         ::RegOpenKey(TRegKey::ClassesRoot, guidBuf, &key) != S_OK) {
  49.       error = "CLSID not found in Registry";
  50.     }
  51.     else {
  52.       long rstat = ::RegQueryValue(key, "InprocServer", path, &pathBufSize);
  53.          ::RegCloseKey(key);
  54.       if (rstat != S_OK) {
  55.         error = "No InprocServer specified in Registry";
  56.       }
  57.       else {
  58.         ::OleInitialize(0);
  59.         HINSTANCE hLib = ::LoadLibrary(path);
  60.         if (hLib < HINSTANCE_ERROR) {
  61.           error = "Could not load library";
  62.         }
  63.         else {
  64.           TDllGetClassObject entry = (TDllGetClassObject)::GetProcAddress(hLib,
  65.                                                            "DllGetClassObject");
  66.           if (!entry) {
  67.             error = "Could not find entry point";
  68.           }
  69.           else {
  70.             IClassFactory* factory;
  71.             GUID guid;
  72.             ::CLSIDFromString(guidBuf+guidKeySize, &guid);
  73.             HRESULT stat = (*entry)(guid, IID_IClassFactory,
  74.                                     (void far*far*)&factory);
  75.             if (stat) {
  76.               error = "Could not obtain factory";
  77.             }
  78.             else {
  79.               IUnknown* ifc;
  80.               stat = factory->CreateInstance(&TDummy(), IID_IUnknown,
  81.                                              (void far*far*)&ifc);
  82.               factory->Release();
  83.               if (stat) {
  84.                 error = "Could not create object";
  85.               }
  86.               else {
  87.                 long refs = ifc->Release();
  88.                 char buf[30];
  89.                 wsprintf(buf, "Reference count = %li", refs);
  90.                 if (refs != 0)
  91.                   error = buf;
  92.               }
  93.             }
  94.           }
  95.           ::FreeLibrary(hLib);
  96.         }
  97.         ::OleUninitialize();
  98.       }
  99.     }
  100.   }
  101.   if (error)
  102.     ::MessageBox(0, error, "DLLRUN - (c) Borland 1994, 1996", MB_OK);
  103.   return error != 0;
  104. }
  105.